<?php

declare(strict_types=1);

namespace App\Controller\Tunnel;

use App\Controller\AbstractController;
use Yolo\Service\Annotations\Tunnel;
use Yolo\Service\ApiGateway;

class IndexController extends AbstractController
{
    public array $attributes = [
        'age' => '年龄',
        'name' => '名字',
    ];

    #[Tunnel([
        'validation' => [
            'name' => 'required',
            'age' => 'required'
        ], // 参数$args的校验规则
        'permissions' => [], // 所需权限
        'options' => [
        ], // 其他选项，如是否需要cookie
    ])]
    public function test(array $args, array $metadata): array
    {
        return ApiGateway::OK_RESPONSE;
    }

    #[Tunnel([
        'name' => 'SayHello', // 你可以自定义api名称，否则默认为首字母大写的方法名
        'validation' => [
            'name' => 'required',
            'age' => 'required'
        ],
        'permissions' => [],
        'options' => [
            'clientIp' => true, // 需要客户端ip
            'cookie' => true, // 需要cookie
        ],
    ])]
    public function hello(array $args, array $metadata): array
    {
        $name = $args['name'] ?? 'Yolo';
        return [
            'name' => $name,
            'now' => date('Y-m-d H:i:s'),
        ];
    }

    #[Tunnel([
        'validation' => [],
        'permissions' => [],
        'options' => [
        ],
    ])]
    public function showError1(array $args, array $metadata): array
    {
        // 抛出一个预先定义好的RPC异常
        throw ApiGateway::responseError('test_error', [
            'a' => 1,
            'b' => 2,
        ]);
    }

//    #[Tunnel([
//        'validation' => [],
//        'permissions' => [],
//        'options' => [
//        ],
//    ])]
//    public function showError2(array $args, array $metadata): array
//    {
//        // 抛出一个RPC异常，此异常不会注册到异常注册器，不可使用ApiGateway::responseError('test_error')
//        $e = new ResponseError('system', 'test_error', 'It will throw a rpc exception.');
//        $e->setMetadata([]);
//        $e->setHttpStatus(400);
//        throw ApiGateway::responseNewError($e);
//    }
}
